#include <stdio.h> // 标准输入输出头文件(文件)
#include <string.h>

// 1
struct Student
{
    int id;
    char name[20];
};

int main()
{
    // 打开一个文件  
    // 1. 文件路径
    // 绝对路径：从系统根目录开始排列的路径：/home/lvguanzhong/95/C++进阶/文件编程/file.c
    // 相对路径：相对于运行程序的路径      ./ 和运行程序在同一目录下
    // 文件名：文件的名称+文件后缀名
    // 2. 打开文件的方式
    // w:只写：文件不存在，就创建文件，如果存在，会清空文件
    // r:只读：文件不存在就报错
    // a:(append)追加写：文件不存在就创建，如果存在，会在尾部继续写
    // w+ r+ a+ :读写
    FILE *f = fopen("./test.txt", "r");   // 返回值：结构体指针
    if (f == NULL) // 打开文件失败：读的时候文件不存在  权限不够
    {
        printf("打开文件失败\n");
        return -1;
    }
    // fget 从文件中读取一个字符
    char c = 0;
    // EOF:end of file 文件末尾
    while((c = fgetc(f)) != EOF)
    {
        printf("%c",c);
    }
    printf("\n");

    // char s[] = "helloworlddyhgfgetygfer";
    // // fputc:往文件里写一个字符
    // for (int i = 0; i < strlen(s); i++)
    // {
    //     fputc(s[i], f);
    // }

    // 从终端中输入
    // char c = 0;
    // while ((c = getchar()) != '\n')
    //     fputc(c, f);
    // fputc('\n',f);   // 加个换行

    // fgets 从文件中读取一个字符串
    // char s[20] = {0};
    // fgets(s, 20, f);   // 读n个字符，有换行，读到换行结束; 没换行，读n个(包含换行)
    // printf("read:%s\n", s);

    // fputs:往文件里写一个字符串
    // fputs("helloworld,jack",f);

    // fwrite:把某一块内存写入文件
    // struct Student s = {1,"zhangsan"};
    // fwrite(&s,sizeof(s),1,f);

    // fread:从文件里写读取一块数据
    // _n :读多少次
    struct  Student s;
    fread(&s,sizeof(s),1,f);
    printf("id: %d name:%s\n",s.id,s.name);

    // 移动光标
    // 偏移量
    // 光标移动到文件末尾
    // fseek(f,0,SEEK_END);  // 偏移量为0
    // fseek(f,2,SEEK_SET);
    // printf("%c\n",fgetc(f));

    // fseek(f,-2,SEEK_END);
    // // 返回值：当前光标位置和首位置的偏移量
    // printf("%ld\n",ftell(f));   // 输出3

    // 计算一个文件的大小
    fseek(f, 0, SEEK_END); // 光标放末尾
    printf("%ld\n", ftell(f));

    // 文件关闭
    fclose(f);   // 一个文件的打开和关闭都是一起的

    return 0;
}
